package arithmetic;

import java.util.Scanner;

/**
 * HJ20密码验证合格程序
 * 知识点：
 * 1.ASCII码 0-9/48-57 A-Z/65-90 a-z/97-122
 * 2.String.indexOf();
 * 3.String.lastIndexOf();
 * 4.String.toCharArray();
 * 5.String.length();
 * 描述
 * 密码要求:
 *
 * 1.长度超过8位
 *
 * 2.包括大小写字母.数字.其它符号,以上四种至少三种
 *
 * 3.不能有长度大于2的包含公共元素的子串重复 （注：其他符号不含空格或换行）
 *
 * 数据范围：输入的字符串长度满足
 * 1
 * ≤
 * �
 * ≤
 * 100
 *
 * 1≤n≤100
 * 输入描述：
 * 一组字符串。
 *
 * 输出描述：
 * 如果符合要求输出：OK，否则输出NG
 *
 * 示例1
 * 输入：
 * 021Abc9000
 * 021Abc9Abc1
 * 021ABC9000
 * 021$bc9000
 * 复制
 * 输出：
 * OK
 * NG
 * NG
 * OK
 */
public class TestHW20 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        // while (in.hasNextInt()) { // 注意 while 处理多个 case
        //     int a = in.nextInt();
        //     int b = in.nextInt();
        //     System.out.println(a + b);
        // }
        String strs = test(in);
        // System.out.println(strs);
        if (strs.isEmpty())return;
        // System.out.println(" ".isBlank());
        testResult(strs);

    }

    public static void testResult(String str){
        String[] strs = str.split(";");
        int index = 0;
        while(index<strs.length){
            String str1 = strs[index];
            //判断长度
            boolean f1 = testLen(str1);
            if(!f1){
                System.out.println("NG");
                index++;
                continue;
            }
            //判断字符类型
            f1 = testContent(str1);
            if(!f1){
                System.out.println("NG");
                index++;
                continue;
            }
            //判断子串重复
            f1 = testRepeat(str1);
            if(!f1){
                System.out.println("NG");
                index++;
                continue;
            }
            System.out.println("OK");
            index++;
        }
    }

    //不能有长度大于2的包含公共元素的子串重复
    public static boolean testRepeat(String str) {
        int index = 0;
        int i1 = str.length() - 2;
        boolean f1 = true;
        while (index < i1) {
            int end = index+3;
            String subStr = str.substring(index, end);
            boolean f2 = str.indexOf(subStr) != str.lastIndexOf(subStr);
            if (f2) {
                f1 = false;
                break;
            }
            index++;
        }
        return f1;
    }

    //判断字符串是否包含大小写字母，数字，其他字符，且其他字符不含空格和换行
    public static boolean testContent(String str) {
        boolean f = true;
        char[] chs = str.toCharArray();
        int num = 0;
        int upper = 0;
        int low = 0;
        int other = 0;
        for (int i = 0; i < chs.length; i++) {
            char ch = chs[i];
            //不能包含空格
            if (String.valueOf(ch).trim().isEmpty()) {
                f = false;
                break;
            }
            //0-9
            if (ch >= 48 && ch <= 57) {
                num = 1;
                continue;
            }
            //A-Z
            if (ch >= 65 && ch <= 90) {
                upper = 1;
                continue;
            }
            //a-z
            if (ch >= 97 && ch <= 122) {
                low = 1;
                continue;
            }
            //其他字符
            other = 1;
        }
        f = (num + upper + low + other) >= 3;
        return f;
    }

    //判断长度是否超过8位，小于等于8位返回false
    public static boolean testLen(String str) {
        int len = str.length();
        boolean f = len > 8;
        return f;
    }

    public static String test(Scanner in) {
        String str = "";
        while (in.hasNextLine()) {
            str += in.nextLine() + ";";
        }
        return str;
    }
}
